#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：scheduler.py 
@File ：人工计划与收池情况对比.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/8/16 上午8:38 
"""

import xlrd
import os
import tkinter as tk
from tkinter import filedialog, messagebox, Button, Label, Entry, StringVar
from typing import List, Dict, Optional
import pandas as pd


def get_index_list(data: pd.DataFrame, columns: List[str]) -> List[str]:
	"""
	从DataFrame中指定的列名列表里，找到存在的列并获取索引列表，去除空值和重复值。
	"""
	for column in columns:
		if column in data.columns:
			return data[column].dropna().astype(str).str.strip().drop_duplicates().tolist()
	return []


def manual_plan_compare(manual_data_path: str, target_dir_path: str) -> Optional[str]:
	"""
	比较人工计划与目标文件，并输出结果。
	"""
	try:
		# 读取人工计划数据
		manual_data = pd.read_excel(manual_data_path)
		manual_index_list = get_index_list(manual_data, ["板坯号", "入口材料号"])

		# 初始化结果DataFrame，列名为人工计划中的索引，行为1
		result_df = pd.DataFrame(1, index=manual_index_list, columns=['初始状态'])

		# 目标文件的基础名称列表
		# target_file_basenames = [
		# 	'1.全部库存物料', '2.物料数据预处理结果', '3.A类规则处理结果',
		# 	'4.物料数据留料约束规则筛选结果', '6-1.D类规则主轧材处理结果',
		# 	'6-2.D类规则过渡材处理结果', '6-3.D类规则次轧材处理结果',
		# 	'7-1.主轧材候选物料', '7-2.主轧段候选物料', '7-3.过渡段候选物料'
		# ]
		target_file_basenames = [
			'1.全部库存物料', '2.物料数据预处理结果', '3.A类规则处理结果', '4.物料数据留料约束规则筛选结果', '全部候选物料'
		]

		# 遍历目标目录下的所有Excel文件进行比对
		for basename in target_file_basenames:
			target_file_path = os.path.join(target_dir_path, f"{basename}.xlsx")
			if os.path.exists(target_file_path):
				target_data = pd.read_excel(target_file_path)
				target_index_list = get_index_list(target_data, ["板坯号", "入口材料号"])
				# 为当前文件创建列，并标记不存在的物料为0
				result_df[basename] = 0
				result_df.loc[result_df.index.isin(target_index_list), basename] = 1
			else:
				print(f"Warning: 文件不存在 - {target_file_path}")

		# 添加一个空的"总结"列
		result_df['总结'] = 1

		# 遍历DataFrame的每一行
		for index, row in result_df.iterrows():
			if (row == 1).all():  # 如果所有元素都是1
				result_df.at[index, '总结'] = '通过'
			else:  # 如果存在0
				try:
					zero_column = row[row == 0].index[0]  # 找到第一个为0的列名
					result_df.at[index, '总结'] = f'({zero_column}) 不通过'
				except Exception as e:
					print(f"Error: {e}")

		# 构建输出文件的完整路径
		output_path = os.path.join(target_dir_path, "comparison_result.csv")

		# 将结果导出到CSV文件
		result_df.to_csv(output_path, index_label='入口材料号')

		return output_path

	except Exception as e:
		messagebox.showerror("错误", f"比对过程中发生错误：{str(e)}")
		return None


# 函数：选择人工计划Excel文件路径
def select_source_path():
	"""
	弹出文件选择对话框，选择人工计划Excel文件路径，并更新界面。
	"""
	file_path = filedialog.askopenfilename(
		title="选择人工计划Excel文件",
		filetypes=(("Excel files", "*.xlsx"), ("all files", "*.*"))
	)
	if file_path:
		source_path_var.set(file_path)
		source_path_label.config(text="人工计划Excel文件路径: " + file_path)


# 函数：选择目标文件目录路径
def select_target_path():
	"""
	弹出目录选择对话框，选择目标文件目录路径，并更新界面。
	"""
	dir_path = filedialog.askdirectory(title="选择目标文件目录")
	if dir_path:
		target_path_var.set(dir_path)
		target_path_label.config(text="目标文件目录路径: " + dir_path)


# 函数：执行比对操作
def run_comparison():
	"""
	执行比对操作，将结果存储到CSV文件中，并在完成后通过弹窗通知用户。
	"""
	output_path = manual_plan_compare(
		source_path_var.get(),
		target_path_var.get(),
	)

	if output_path:
		messagebox.showinfo("完成", f"比对结果已保存至: {output_path}")


# 主函数
if __name__ == '__main__':
	# 创建主窗口
	root = tk.Tk()
	root.title("物料比对工具")

	# 设置窗口大小，大约和微信窗口一个大小
	root.geometry("800x600")

	# 设置字体大小
	font_size = 14

	# 创建路径字符串变量
	source_path_var = StringVar(root)
	target_path_var = StringVar(root)

	# 创建人工计划选择按钮和标签
	source_path_label = Label(root, font=("Arial", font_size), text="人工计划Excel文件路径: 未选择")
	source_path_label.pack(pady=20)

	source_path_choose_button = Button(root, font=("Arial", font_size), text="选择人工计划Excel文件", command=select_source_path)
	source_path_choose_button.pack(pady=20)

	# 创建目标文件目录选择按钮和标签
	target_path_label = Label(root, font=("Arial", font_size), text="目标文件目录路径: 未选择")
	target_path_label.pack(pady=20)

	target_path_choose_button = Button(root, font=("Arial", font_size), text="选择目标文件目录", command=select_target_path)
	target_path_choose_button.pack(pady=20)

	# 创建执行比对按钮
	compare_button = Button(root, font=("Arial", font_size), text="执行比对", command=run_comparison)
	compare_button.pack(pady=20)

	# 运行主循环
	root.mainloop()
